package com.boil.util;

/**
 * Created by ChenYong on 2016-09-21.
 * <br>
 * 普通分页实体类，初始化分页实例的步骤（非常重要）：
 * <ol>
 * <li>初始化每页大小，pageSize；</li>
 * <li>初始化当前页数，currPage；</li>
 * <li>初始化总记录数，count。</li>
 * </ol>
 */
public final class Page1<E> extends Page<E> {
    /**
     * 上一页
     */
    private long prevPage;
    /**
     * 当前页
     */
    private long currPage;
    /**
     * 下一页
     */
    private long nextPage;

    /**
     * 构造器。
     *
     * @param pageSize 页码
     * @param currPage 当前页
     */
    public Page1(int pageSize, long currPage) {
        if (pageSize <= Constants.VALUE_0) {
            pageSize = Constants.VALUE_1;
        }

        this.pageSize = pageSize;

        if (currPage <= Constants.VALUE_L_0) {
            currPage = Constants.VALUE_L_1;
        }

        this.currPage = currPage;
    }

    /**
     * 设置总记录数。
     *
     * @param count 总记录数
     */
    @Override
    public void setCount(long count) {
        this.count = count;

        validate();
    }

    /**
     * 获取上一页。
     *
     * @return 上一页
     */
    public long getPrevPage() {
        return prevPage;
    }

    /**
     * 获取当前页。
     *
     * @return 当前页
     */
    public long getCurrPage() {
        return currPage;
    }

    /**
     * 获取下一页。
     *
     * @return 下一页
     */
    public long getNextPage() {
        return nextPage;
    }

    /**
     * 获取开始记录数。
     *
     * @return 开始记录数
     */
    @Override
    public long getStartRecords() {
        return ((getCurrPage() - Constants.VALUE_L_1) * pageSize);
    }

    /**
     * 获取结束记录数。
     *
     * @return 结束记录数
     */
    @Override
    public long getEndRecords() {
        return ((getCurrPage() * pageSize));
    }

    /**
     * 校验数据，使数据合法化。
     */
    private void validate() {
        // 设置总记录数
        if (count <= Constants.VALUE_L_0) {
            count = Constants.VALUE_L_0;
        }

        // 设置总页数
        if (count == Constants.VALUE_L_0) {
            pages = Constants.VALUE_L_1;
        } else if ((count % pageSize) == Constants.VALUE_L_0) {
            pages = (count / pageSize);
        } else {
            pages = ((count / pageSize) + Constants.VALUE_L_1);
        }

        // 设置当前页
        if (currPage <= Constants.VALUE_L_1) {
            currPage = Constants.VALUE_L_1;
        } else if (currPage >= pages) {
            currPage = pages;
        }

        // 设置上一页
        if (currPage == Constants.VALUE_L_1) {
            prevPage = Constants.VALUE_L_1;
        } else {
            prevPage = (currPage - Constants.VALUE_L_1);
        }

        // 设置下一页
        if (currPage == pages) {
            nextPage = pages;
        } else {
            nextPage = (currPage + Constants.VALUE_L_1);
        }
    }

    @Override
    public String toString() {
        return "Page1 [prevPage=" + prevPage + ", currPage=" + currPage + ", nextPage=" + nextPage + ", count=" + count
                + ", pages=" + pages + ", pageSize=" + pageSize + ", params=" + params + ", paramss=" + paramss
                + ", results=" + results + "]";
    }
}